/*****************************************************
Programa para testar comunicacao usando sockets
cliente

Versao multiplataforma (Funciona e Linux e em Windows)

	Marcos A. Stemmer

	Adaptado para uso no UIP por:
	Marco Túlio Martins

-------
Ao fazer o projeto no Dev-cpp acrescente a biblioteca libwsock32.a
	No menu Project
	Submenu Project Options
	Tab	Parameters
	Botao	Add Library Object
	Selecionar o arquivo:
		C/Dev-Cpp/lib/libwsock32.a
 *****************************************************/
#include "cli_webSock.h"
#include "../uart/uart.h"
#include "string.h"
#include "uip.h"
#include "psock.h"
//#include "uip-conf.h"

char cabec_or[20];	//cabecalho do chat.
char cabec_dest[20];	//cabecalho do chat.

void chat_end(struct chat_state *s);
void chat_init(){
	uip_listen(HTONS(CHAT_PORT));
}

void chat_start(){
	//conv com a UART. main do chat.

	sprintf(cabec_or, "%d-CHAT>", CHAT_PORT);
	sprintf(cabec_dest, ":%d->", CHAT_PORT);

	chat_init();
	uart_puts("Bem Vindo ao chat.\n");
	uart_puts(cabec_or);
	global_chat_flag = 1; //enquanto 1 a UART fica bloqueada para o chat.
}

void chat_appcall(void){
	char * dest;
	int tambuff;

	struct chat_state *s = (struct chat_state *)&(uip_conn->appstate.chat_st);

	//quando uma nova conexão é estabelecida.
	if(uip_connected()){
		DEBUG_SOCK_INFO("try connection\n");
		PSOCK_INIT(&prot, s->inbuff, sizeof(s->inbuff));
		DEBUG_SOCK_INFO("connection .. ok");
		s->state = WAITING_CHAT;
	}

//	DEBUG_SOCK_INFO("Iniciando comunicacao.\n");
	chat_communication(s);

}


void chat_communication(struct chat_state *s){
	char dest[100];
	PSOCK_BEGIN(&prot);

	if(PSOCK_NEWDATA(&prot)==1){
		DEBUG_SOCK_INFO("recebendo dados.\n");
		PSOCK_READTO(&prot, '\n');
		uart_puts(cabec_dest);	//monta cabecalho para origem (placa) escrever.
		strncpy(dest, s->inbuff, strlen(s->inbuff));
		uart_puts(dest);	//envia para a UART os dados que vieram.
		uart_putc('\n');
	}
	uart_puts(cabec_or);	//monta cabecalho para origem (placa) escrever.
	DEBUG_SOCK_INFO("enviando dados\n");
	UARTTakeString(s->buff, UART_CH_0);	//pega dados da uart
	PSOCK_SEND_STR(&prot, s->buff);	//envia para a socket.
	DEBUG_SOCK_INFO("dados enviados\n");
	uart_puts(cabec_dest);//aguarda o que o destino vai mandar.
	if(!strcmp(s->buff,"quit")){
		global_chat_flag = 0;	//verifica se é para sair do chat
		uart_puts("bye.\n");

		PSOCK_CLOSE(&prot);
		PSOCK_END(&prot);
		PSOCK_CLOSE_EXIT(&prot);
	}
}

